Reactã®experimental_useDeferredValueããã¯ãæ¢æ±ããéèŠã§ãªãæŽæ°ãé å»¶ãããããšã§UIããã©ãŒãã³ã¹ãæé©åããŸããæ¬ã¬ã€ãã§ã¯äœ¿çšæ³ãå©ç¹ãé«åºŠãªãã¯ããã¯ã解説ããŸãã
React experimental_useDeferredValueå®è£ ïŒé å»¶ãããå€ã®æŽæ°ã«ã€ããŠã®è©³çŽ°è§£èª¬
é²åãç¶ãããŠã§ãéçºã®äžçã«ãããŠãããã©ãŒãã³ã¹ã®æé©åã¯äŸç¶ãšããŠéèŠãªèª²é¡ã§ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããããã®äž»èŠãªJavaScriptã©ã€ãã©ãªã§ããReactã¯ããããã®èª²é¡ã«å¯ŸåŠããããã«ç¶ç¶çã«æ°ããæ©èœãããŒã«ãå°å
¥ããŠããŸãããã®ãããªããŒã«ã®äžã€ãexperimental_useDeferredValueããã¯ã§ãããUIã®éèŠã§ãªãéšåãžã®æŽæ°ãé
å»¶ãããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®äœæçãªå¿çæ§ãåäžãããããã«èšèšãããŠããŸãããã®èšäºã§ã¯ãexperimental_useDeferredValueã®ç®çãäœ¿çšæ³ãå©ç¹ãããã³é«åºŠãªãã¯ããã¯ã«ã€ããŠå
æ¬çã«è§£èª¬ããŸãã
é å»¶ãããå€ã®æŽæ°ãçè§£ãã
experimental_useDeferredValueã®è©³çްã«å
¥ãåã«ãé
å»¶ãããå€ã®æŽæ°ãšããæŠå¿µãçè§£ããããšãéèŠã§ããæ¬è³ªçã«ãé
å»¶æŽæ°ãšã¯ãéèŠãªUIèŠçŽ ã®ã¬ã³ããªã³ã°ãåªå
ããéèŠæ§ã®äœãèŠçŽ ã®ã¬ã³ããªã³ã°ãå»¶æããããšã§ãããã®ãã¯ããã¯ã¯ãé¡èãªã©ã°ãã«ã¯ã€ããåŒãèµ·ããå¯èœæ§ã®ãããèšç®ã³ã¹ãã®é«ãæäœãå€§èŠæš¡ãªããŒã¿ã»ãããæ±ãå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
ãŠãŒã¶ãŒãå ¥åãã£ãŒã«ãã«ã¯ãšãªãå ¥åããæ€çŽ¢ã¢ããªã±ãŒã·ã§ã³ãæ³åããŠã¿ãŠãã ããããŠãŒã¶ãŒãå ¥åããã«ã€ããŠãã¢ããªã±ãŒã·ã§ã³ã¯å€§èŠæš¡ãªçµæãªã¹ãããã£ã«ã¿ãªã³ã°ãããªã¢ã«ã¿ã€ã ã§è¡šç€ºããŸããæé©åãè¡ããªããšãåããŒã¹ãããŒã¯ãçµæãªã¹ãã®å®å šãªåã¬ã³ããªã³ã°ãåŒãèµ·ããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœäžããå¯èœæ§ããããŸããé å»¶æŽæ°ã䜿çšãããšãå ¥åãã£ãŒã«ããšåºæ¬çãªæ€çŽ¢æ©èœã¯å¿çæ§ãä¿ã¡ãªãããçµæãªã¹ãã®ã¬ã³ããªã³ã°ã¯ãŠãŒã¶ãŒãã¿ã€ãã³ã°ãäžæåæ¢ãããŸã§å»¶æãããŸããããã«ããããŠãŒã¶ãŒã¯äžæããããšãªãã¿ã€ãã³ã°ãç¶ããããšãã§ããã¢ããªã±ãŒã·ã§ã³å šäœã®äœæããã©ãŒãã³ã¹ãåäžããŸãã
experimental_useDeferredValueã®ç޹ä»
experimental_useDeferredValueã¯ãå€ã®æŽæ°ãé
å»¶ãããããšãã§ããReactããã¯ã§ããå€ ãå
¥åãšããŠåãåãããã®å€ã®æ°ããé
å»¶ããŒãžã§ã³ãè¿ããŸããReactã¯é
å»¶ãããå€ãã§ããã ãæ©ãæŽæ°ããããšããŸããããŠãŒã¶ãŒå
¥åãã¢ãã¡ãŒã·ã§ã³ãªã©ãããç·æ¥ãšèŠãªãããä»ã®æŽæ°ãåªå
ããŸãã
experimental_useDeferredValueã®æ žãšãªãèãæ¹ã¯ãæŽæ°ã®åªå
é äœä»ãã¡ã«ããºã ãæäŸããããšã§ããããã«ãããReactã®ã¹ã±ãžã¥ãŒã©ã¯ã©ã®æŽæ°ãæãéèŠãã倿ããããããæåã«å®è¡ã§ãããããããã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå®çŸããŸãã
experimental_useDeferredValueã®ä»çµã¿
experimental_useDeferredValueã䜿çšãããšãReactã¯æäŸãããå€ã®é
å»¶ããŒãžã§ã³ãäœæããŸãããã®é
å»¶ãããå€ã¯ãæåã¯å
ã®å€ãšåãã§ããããããå
ã®å€ã倿ŽããããšããReactã¯é
å»¶ãããå€ãããã«æŽæ°ããŸããã代ããã«ãReactã¹ã±ãžã¥ãŒã©ãé©åãšå€æãããšãã«ãåŸã§é
å»¶ãããå€ã®æŽæ°ãã¹ã±ãžã¥ãŒã«ããŸãã
ãã®éãé å»¶ãããå€ã䜿çšããã³ã³ããŒãã³ãã¯ã以åã®å€ã§ã¬ã³ããªã³ã°ãç¶ããŸããããã«ãããããã¯ã°ã©ãŠã³ãã§é å»¶ãããå€ãæŽæ°ãããŠããéããã³ã³ããŒãã³ãã¯ãŠãŒã¶ãŒå ¥åããã®ä»ã®ç·æ¥ã®æŽæ°ã«å¿çãç¶ããããšãã§ããŸãã
Reactãé å»¶ãããå€ãæŽæ°ããæºåãæŽããšãããã䜿çšããã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ããŸããããã«ãããUIãæ°ããå€ã§æŽæ°ãããé å»¶æŽæ°ããã»ã¹ãå®äºããŸãã
experimental_useDeferredValueã®äœ¿çšïŒå®è·µçãªäŸ
åè¿°ã®æ€çŽ¢ã¢ããªã±ãŒã·ã§ã³ã®äŸãèããŠã¿ãŸããããexperimental_useDeferredValueã䜿çšããŠãæ€çŽ¢çµæãªã¹ãã®ã¬ã³ããªã³ã°ãé
å»¶ãããããšãã§ããŸãã以äžã¯ç°¡ç¥åãããã³ãŒãã¹ããããã§ãïŒ
import React, { useState, experimental_useDeferredValue } from 'react';
function SearchResults({ query }) {
const deferredQuery = experimental_useDeferredValue(query);
const results = filterResults(deferredQuery); // Assume filterResults is an expensive operation
return (
{results.map(result => (
- {result.name}
))}
);
}
function SearchInput() {
const [query, setQuery] = useState('');
return (
setQuery(e.target.value)} />
);
}
export default SearchInput;
ãã®äŸã§ã¯ãSearchResultsã³ã³ããŒãã³ãã¯ãŠãŒã¶ãŒã®æ€çŽ¢å
¥åã衚ãqueryãããããåãåããŸããexperimental_useDeferredValueã䜿çšããŠãqueryã®é
å»¶ããŒãžã§ã³ã§ããdeferredQueryãäœæããŸããé«ã³ã¹ããªæäœã§ãããšæ³å®ãããfilterResults颿°ã¯ãå
ã®queryã®ä»£ããã«deferredQueryã䜿çšããããã«ãªããŸãã
ããã¯ããŠãŒã¶ãŒãå
¥åãã£ãŒã«ãã«å
¥åãããšãqueryã¹ããŒãã¯å³åº§ã«æŽæ°ãããããšãæå³ããŸããããããfilterResults颿°ãšçµæãªã¹ãã®ã¬ã³ããªã³ã°ã¯ãReactãããããåŠçããæéããããŸã§é
å»¶ãããŸããããã«ãããçµæãªã¹ãã®æŽæ°ã«æéãããã£ãŠããå Žåã§ããå
¥åãã£ãŒã«ãã¯å¿çæ§ãä¿ã€ããšãã§ããŸãã
experimental_useDeferredValueã䜿çšããå©ç¹
experimental_useDeferredValueã䜿çšãããšãããã€ãã®å©ç¹ããããŸãïŒ
- äœæããã©ãŒãã³ã¹ã®åäžïŒéèŠã§ãªãæŽæ°ãé å»¶ãããããšã§ãã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒã®æäœã«å¯ŸããŠããå¿çæ§ãé«ããšæããããããã«ãªããŸãã
- ããããã³ã°æéã®åæžïŒé å»¶æŽæ°ã«ãããæéã®ãããæäœãã¡ã€ã³ã¹ã¬ããããããã¯ããã®ãé²ããããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãä¿èšŒããŸãã
- æŽæ°ã®åªå
é äœä»ãïŒ
experimental_useDeferredValueã«ãããReactã¯éèŠåºŠã«åºã¥ããŠæŽæ°ã®åªå é äœãä»ããæãéèŠãªæŽæ°ãæåã«åŠçãããããã«ããŸãã - ã³ãŒãã®ç°¡çŽ åïŒãã®ããã¯ã¯ãé å»¶æŽæ°ã管çããããã®ã¯ãªãŒã³ã§å®£èšçãªæ¹æ³ãæäŸããã³ãŒãã®èªã¿ããããšä¿å®æ§ãåäžãããŸãã
é«åºŠãªãã¯ããã¯ãšèæ ®äºé
experimental_useDeferredValueã¯æ¯èŒçç°¡åã«äœ¿çšã§ããŸãããçæãã¹ãããã€ãã®é«åºŠãªãã¯ããã¯ãšèæ
®äºé
ããããŸãïŒ
Transition APIãšã®äœµçš
experimental_useDeferredValueã¯ãReactã®Transition APIãšçµã¿åããããšããŸãæ©èœããããšããããããŸãããã©ã³ãžã·ã§ã³ã¯ãæŽæ°ãé²è¡äžã§ããããšããŠãŒã¶ãŒã«èŠèŠçã«ç€ºãæ¹æ³ãæäŸããŸãããã©ã³ãžã·ã§ã³ã䜿çšããŠãé
å»¶ãããã³ã³ãã³ããã¹ã ãŒãºã«ãã§ãŒãã€ã³ãŸãã¯ãã§ãŒãã¢ãŠããããããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸãã
import React, { useState, experimental_useDeferredValue, useTransition } from 'react';
function SearchResults({ query }) {
const [isPending, startTransition] = useTransition();
const deferredQuery = experimental_useDeferredValue(query);
const results = filterResults(deferredQuery);
return (
{results.map(result => (
- {result.name}
))}
);
}
function SearchInput() {
const [query, setQuery] = useState('');
return (
setQuery(e.target.value)} />
);
}
ãã®äŸã§ã¯ãuseTransitionããã¯ã¯ãã©ã³ãžã·ã§ã³ãé²è¡äžãã©ããã瀺ãisPendingãã©ã°ãæäŸããŸãããã®ãã©ã°ã䜿çšããŠçµæãªã¹ãã®äžéæåºŠã調æŽããçµæãæŽæ°äžã§ããããšããŠãŒã¶ãŒã«èŠèŠçã«äŒããŸããæ³šæïŒããã§ã¯startTransitionãçŽæ¥äœ¿çšããŠããŸããããããã¹ããŒãæŽæ°èªäœãé
å»¶ããããå Žåã¯ãã¯ãšãªã¹ããŒããæŽæ°ããéã«äœ¿çšããŸããäŸïŒonChange={e => startTransition(() => setQuery(e.target.value))}
ããã©ãŒãã³ã¹ã®æž¬å®
experimental_useDeferredValueã䜿çšããããšã«ããããã©ãŒãã³ã¹ãžã®åœ±é¿ã枬å®ããããšãäžå¯æ¬ ã§ããReact Profilerããã©ãŠã¶ã®éçºè
ããŒã«ã䜿çšããŠãããã¯ãé©çšããååŸã®ã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãåæããŠãã ãããããã«ãããããã¯ãå®éã«ããã©ãŒãã³ã¹ãåäžãããŠãããã©ããã倿ããæœåšçãªããã«ããã¯ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
é床ãªé å»¶ã®åé¿
æŽæ°ãé å»¶ãããããšã¯ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãããé床ã«é å»¶ãããããšã¯é¿ããã¹ãã§ããããŸãã«ãå€ãã®æŽæ°ãé å»¶ããããšãUIãå¿çããªãããã«æãããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœäžããå¯èœæ§ããããŸããã©ã®æŽæ°ãæ¬åœã«éèŠã§ãªãããæ éã«æ€èšãããããã®æŽæ°ã®ã¿ãé å»¶ãããŠãã ããã
Reactã¹ã±ãžã¥ãŒã©ã®çè§£
experimental_useDeferredValueã®åäœã¯ãReactã®ã¹ã±ãžã¥ãŒã©ãšå¯æ¥ã«é¢é£ããŠããŸããã¹ã±ãžã¥ãŒã©ãã©ã®ããã«æŽæ°ã®åªå
é äœãä»ããããçè§£ããããšã¯ãããã¯ã广çã«äœ¿çšããããã«äžå¯æ¬ ã§ããã¹ã±ãžã¥ãŒã©ã®è©³çްã«ã€ããŠã¯ãReactã®ããã¥ã¡ã³ããåç
§ããŠãã ããã
ã°ããŒãã«ãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
äžçäžã«åæ£ãããã¢ããªã±ãŒã·ã§ã³ã§experimental_useDeferredValueã䜿çšããå Žåã¯ã次ã®ç¹ãèæ
®ããŠãã ããïŒ
- ãããã¯ãŒã¯é å»¶ïŒç°ãªãå°ççå Žæã«ãããŠãŒã¶ãŒã¯ãããŸããŸãªãããã¯ãŒã¯é å»¶ãçµéšããå¯èœæ§ããããŸããããã¯ãç¹ã«ãªã¢ãŒããµãŒããŒããããŒã¿ãèªã¿èŸŒãéã«ãã¢ããªã±ãŒã·ã§ã³ã®äœæããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããã³ãŒãåå²ãé å»¶èªã¿èŸŒã¿ãªã©ã®ãã¯ããã¯ã䜿çšããŠãåæèªã¿èŸŒã¿æéãæå°éã«æããŠãã ããã
- ããã€ã¹ã®èœåïŒãŠãŒã¶ãŒã¯ãåŠçèœåãã¡ã¢ãªãç°ãªãããŸããŸãªããã€ã¹ããã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããŠããå¯èœæ§ããããŸãããã¹ãŠã®ãŠãŒã¶ãŒã«ã¹ã ãŒãºãªäœéšãä¿èšŒããããã«ãäœã¹ããã¯ã®ããã€ã¹åãã«ã¢ããªã±ãŒã·ã§ã³ãæé©åããŠãã ããã
- ããŒã«ãªãŒãŒã·ã§ã³ïŒããŒã«ãªãŒãŒã·ã§ã³ãããã©ãŒãã³ã¹ã«äžãã圱é¿ãèæ ®ããŠãã ãããè€éãªããã¹ãã¬ã€ã¢ãŠãã®ã¬ã³ããªã³ã°ãã倧ããªæåã»ããã®åŠçã¯ãèšç®ã³ã¹ããé«ããªãå¯èœæ§ããããŸããé©åãªæé©åãã¯ããã¯ã䜿çšããŠãããã©ãŒãã³ã¹ãžã®åœ±é¿ãæå°éã«æããŠãã ããã
- ã¢ã¯ã»ã·ããªãã£ïŒé å»¶æŽæ°ã䜿çšããŠããå Žåã§ããã¢ããªã±ãŒã·ã§ã³ãé害ãæã€ãŠãŒã¶ãŒã«ãšã£ãŠã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŠãã ãããã³ã³ãã³ããæŽæ°äžã§ããããšã瀺ãæç¢ºãªèŠèŠçåå³ãæäŸããæ¯æŽæè¡ãUIãæ£ããè§£éã§ããããã«ããŠãã ããã
experimental_useDeferredValueã®ä»£æ¿ææ®µ
experimental_useDeferredValueã¯åŒ·åãªããŒã«ã§ããããã¹ãŠã®ããã©ãŒãã³ã¹åé¡ã«å¯Ÿããæåã®è§£æ±ºçãšã¯éããŸããã以äžã«èæ
®ãã¹ãä»£æ¿ææ®µãããã€ã瀺ããŸãïŒ
- ãããŠã³ã¹ãšã¹ããããªã³ã°ïŒãããŠã³ã¹ãšã¹ããããªã³ã°ã¯ã颿°ãåŒã³åºãããé »åºŠãå¶éãããã¯ããã¯ã§ãããããã®ãã¯ããã¯ã¯ããŠãŒã¶ãŒå ¥åã«å¿çããã€ãã³ããã³ãã©ãªã©ãæé©åããã®ã«åœ¹ç«ã¡ãŸãã
- ã¡ã¢åïŒã¡ã¢åã¯ãé«ã³ã¹ããªé¢æ°åŒã³åºãã®çµæããã£ãã·ã¥ãããã¯ããã¯ã§ããããã¯ãåãããããã§é »ç¹ã«åã¬ã³ããªã³ã°ãããã³ã³ããŒãã³ããæé©åããã®ã«åœ¹ç«ã¡ãŸãã
- ã³ãŒãåå²ïŒã³ãŒãåå²ã¯ãã¢ããªã±ãŒã·ã§ã³ããªã³ããã³ãã§èªã¿èŸŒããå°ããªãã£ã³ã¯ã«åå²ãããã¯ããã¯ã§ããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®åæèªã¿èŸŒã¿æéãççž®ãããããã©ãŒãã³ã¹ãåäžããŸãã
- ä»®æ³åïŒä»®æ³åã¯ãå€§èŠæš¡ãªããŒã¿ãªã¹ããå¹ççã«ã¬ã³ããªã³ã°ãããã¯ããã¯ã§ãããªã¹ãå ã®ãã¹ãŠã®é ç®ãäžåºŠã«ã¬ã³ããªã³ã°ããã®ã§ã¯ãªããä»®æ³åã§ã¯çŸåšç»é¢ã«è¡šç€ºãããŠããé ç®ã®ã¿ãã¬ã³ããªã³ã°ããŸãã
çµè«
experimental_useDeferredValueã¯ãéèŠã§ãªãæŽæ°ãé
å»¶ãããããšã§Reactã¢ããªã±ãŒã·ã§ã³ãæé©åããããã®è²ŽéãªããŒã«ã§ããéèŠãªæŽæ°ãåªå
ããéèŠæ§ã®äœãæŽæ°ãå»¶æããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®äœæçãªå¿çæ§ãåäžãããããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸããããããããã¯ã®ãã¥ã¢ã³ã¹ãçè§£ããè³¢æã«äœ¿çšããããšãéèŠã§ãããã®èšäºã§æŠèª¬ããé«åºŠãªãã¯ããã¯ãšãã¹ããã©ã¯ãã£ã¹ãèæ
®ããããšã§ãexperimental_useDeferredValueã广çã«æŽ»çšããŠãReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
倿Žã«ããããã©ãŒãã³ã¹ãžã®åœ±é¿ãåžžã«æž¬å®ããå¿ èŠã«å¿ããŠä»£æ¿ã®æé©åãã¯ããã¯ãæ€èšããããšãå¿ããªãã§ãã ãããReactãé²åãç¶ããã«ã€ããŠãããã©ãŒãã³ã¹ã®èª²é¡ã«å¯ŸåŠããããã®æ°ããããŒã«ããã¯ããã¯ãç»å ŽããŸãããããã®ååã«ã€ããŠåžžã«æ å ±ãåŸãŠããããšã¯ãäžçäžã§åè¶ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸãã髿§èœãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãã
experimental_useDeferredValueãçè§£ãå®è£
ããããšã§ãéçºè
ã¯ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã®ããã«ããå¿çæ§ãé«ãããŠãŒã¶ãŒãã¬ã³ããªãŒãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãäœæããããã®å€§ããªäžæ©ãèžã¿åºãããšãã§ããŸãã